#ifndef _sdl_engine_h_
#define _sdl_engine_h_

#include <iostream>		//standardzik
#include <cstdlib>		//standardzik
#include <list>			//będziemy mieć listę
#include <cstdlib>
#include <algorithm>
#include "SDL.h"
#include "sdl_my_opengl.h"

#include "gl_supported.h"
#include "sdl_layer.h"
#include "gl_extensions.h"
#include "sdl_exceptions.h"
#include "sdl_singleton.h"
#include "sdl_prim.h"
#include "sdl_ptr.h"
#include "sdl_debug.h"

/**
 * \brief Klasa zarządzająca zadaniami oraz wyświetlaniem. Pętla główna.
 * \todo Zaimplementować mechanizm sygnałów, np. w oparciu o boost.
 *
 * Ta klasa zawiera najważniejsze dwa elementy: listę (std::list<sdl_layer*>) zadań, sortowanych wzlgędem priorytetu oraz pętlę while, w której po kolei każde z zadań jest uaktualniane. Docelowo ma być to bardzo, bardzo prosta klasa, a wszystko, co związane z SDL, OpenGL, dźwiękiem itd. powinno zostać wywalone do zewnętrznych zadań. Dlaczego? Być może będziemy chcieli zamienić niektóre procedury związane z SDL na DirectDraw... przykłady są mnogie.
 */

class sdl_engine : public sdl_singleton<sdl_engine>, public sdl_prim {
    ///żyjemy?
    bool active;
    ///lista aktualnych zadań
    std::list<sdl_ptr<sdl_layer> > layers;
    /**
     * \brief Włożenie oczekujących zadań do listy.
     */
    void update_layers();

public:
    /**
     * \brief konstruktor
     */
    sdl_engine();
    ///\brief destruktor
    ~sdl_engine();
    ///\brief główna pętla
    void run();
    ///\brief zabicie pętli głównej
    void kill();
    ///\brief wydrukowanie wszystkich zadań
    void print();
};


#endif //_sdl_engine_h_

